//hack IE reload backgroundImage
try {
    document.execCommand("BackgroundImageCache", false, true);
}
catch (e) {
}

/*扩展Mootools的String类*/
String.implement({
	startsWith : function(s){
		return (this.indexOf(s) == 0);
		},

	/*
	 *截断字符串,并可在末端添加省略号
	 */	
	truncate : function(len, ae){
		if(this.length <= len){
			return this;
			}
		else{
			var s = this.substr(0, len);
			s = ae ? s + '...' : s;
			return s;
			}	
		},

    formatWithObject: function(obj) {
        return this.replace(/\$\{([^\}]+)\}/g, function(a, b) {
            return obj[b];
        });
    }
});

/*扩展Mootools的Element类*/
Element.implement({
	
    /*
    * 显示element
    */
    show: function(type) {
        //var InlineElements = 
        //['A','SPAN','B','CITE','CODE','DFN','EM','FONT','I'];
        var BlockElements = ['DIV', 'DL', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR',
			'OL', 'P', 'PRE', 'TABLE', 'UL'];
        var tagName = this.tagName.toUpperCase();
        var display = '';
        if (this.$_pmoo_display == 'block' || this.$_pmoo_display == 'inline') {
            display = this.$_pmoo_display;
        }
        else {
            display = BlockElements.indexOf(tagName) == -1 ? 'inline' : 'block';
        }
		display = type ? type : display;
        this.setStyle('display', display);
    },

    /*
    * 隐藏element
    */
    hide: function() {
        this.$_pmoo_display = this.getStyle('display');
        this.setStyle('display', 'none');
    },
    
    /*
    * 设置innerHTML
    */
    html: function(s) {
        if (s === undefined) {
            return this.get('html');
        }
        else {
            this.set('html', s + '');
        }
    }
});

/*扩展Mootools的Hash类*/
Hash.implement({
    /*
    * 将查询串转为hash
    */
    fromQueryString: function(qs) {
        var ret = {};
        var pairs = qs.split('&');
        var pair = '';
        var tmp = [];
        for (var i = 0, ilen = pairs.length; i < ilen; i++) {
            pair = pairs[i];
            tmp = pair.split('=');
            ret[tmp[0]] = tmp[1];
        }
        return ret;
    },
    /*
    * 从form中提取数据
    */
    fromForm: function(fid) {
        var fdata = new Hash().fromQueryString($(fid).toQueryString());
        this.combine(fdata);
        return this;
    }
});

/*扩展Mootools的Array类*/
Array.implement({
    /**
    *从数组中随机选择一定数量元素
    */
    select: function(num) {
        function _sort(a, b) {
            var ra = Math.random();
            var ret = 0;
            if (ra < 0.33) { ret = 0; }
            else if (ra < 0.66) { ret = -1; }
            else { ret = 1; }
            //Pmoo.log(ret);
            return ret;
        }

        var len = this.length;
        if (num < 0 || num > len) {
            return this;
        }     
        this.sort(_sort).sort(_sort);
        return this.slice(0, num);
    }
});
	
var Pmoo = {};

//常用常量
Pmoo.isIE = Browser.Engine.trident;
Pmoo.isFF = Browser.Engine.gecko;
Pmoo.isFF2 = Pmoo.isFF && (Browser.Engine.version == 18);
Pmoo.isFF3 = Pmoo.isFF && (Browser.Engine.version == 19);

/**
 * 改进mootools的$$函数
 * @param {Mixed} selector
 */
Pmoo.$$ = function(selector){
	if($type(selector == 'string')){
		return $$(selector);
	}
	else{
		return selector;
	}
};

/**
 * domready事件的快捷方式
 * @param {Function} fn 回调函数
 */
Pmoo.$ = function(fn){
	window.addEvent('domready', fn);
};

/**
 * 定时器类,用于代替setInterval和setTimeout函数
 * @param {Function} cb 回调函数
 * @param {Int} delay 回调间隔 单位(ms)
 * @param {Boolean} periodic 是否周期性执行,默认为true
 */
Pmoo.$interval_ID = 1;
Pmoo.$interval = function(cb, delay, periodic){
	if(!(this instanceof arguments.callee)){
		//可以直接使用Pmoo.$cron而不用new运算符
		Pmoo.log('定时器未初始化,返回实例');
		return new Pmoo.$interval(cb, delay, periodic);
	}
	
	/**
	 * 回调函数(在这里只是做个重命名而已)
	 */
	var fn = cb;
	
	/**
	 * 定时器ID
	 */
	var ID = '__' + (Pmoo.$interval_ID++) + '__';
	Pmoo.log('初始化定时器实例',ID);
	
	/**
	 * 是否周期性执行,默认为true
	 */
	var periodic = !(periodic === false)
	
	/**
	 * 定时器停止标志
	 */
	var toStop = false;
	
	/**
	 * setTimeout timer
	 */
	var timer = null;
	
	/**
	 * 在定时器实例内部定时执行的函数
	 */
	function run(){
		if(toStop){
			//如果调用了停止函数,直接返回
			//因为使用的是setTimeout定时器
			//所以不用清除setTimeout生成的定时器
			return null;
		}
		else{
			fn();
			if(periodic){
				//如果是周期性定时器,定时执行run函数
				timer = setTimeout(run,delay);
			}
		}
	}
	
	/**
	 * 停止定时器
	 */
	this.stop = function(){
		clearTimeout(timer);
		Pmoo.log('停止定时器:'+ID);
		toStop = true;
	};
	
	/**
	 * 开始定时器
	 */
	this.start = function(){
		Pmoo.log('开始定时器:'+ID);
		toStop = false;
		timer = setTimeout(run,delay);	
	};
	
	//开始定时器
	//setTimeout(run,delay);
	this.start();	
};

/**
 * Pmoo.$interval类方法clear
 * 类似于clearInterval的用法
 * @param {Object} timer Pmoo.$interval实例
 */
Pmoo.$interval.clear = function(timer){
	if( ! (timer instanceof Pmoo.$interval)){
		return false;
	}
	timer.stop();
};

/**
 * Utils对象,将一些常用函数封装在此命名空间下
 */
Pmoo.Utils = {

    /**
    * 往页面中添加样式
    * @param {Sting} cssText 
    */
    addCss: function(cssText) {
        var styleEl = document.createElement('style');
        styleEl.type = 'text/css';
        //IE
        if (styleEl.styleSheet) {
            styleEl.styleSheet.cssText = cssText;
        }
        //firefox, maybe others too...	
        else {
            styleEl.appendChild(document.createTextNode(cssText));
        }
        document.getElementsByTagName('head')[0].appendChild(styleEl);
    },
	
	/**
	 * 载入Css文件
	 * @param {String} url
	 */
	loadCss : function(url) {
		if (Pmoo.isIE){
			document.createStyleSheet(url);
		}
		else{
			Pmoo.Utils.addCss('@import url('+url+');')
		}
	}
};

/*
 * 扩展TextNode,支持更多方法
 * @param {String} text 文字节点值
 */
Pmoo.TextNode = function(text) {
    var nodeValue = text;

    var node = document.createTextNode(nodeValue);

    /*
    * 获取dom节点
    */
    this.getElement = function() {
        return node;
    };

    /*
    * 显示文字节点
    */
    this.show = function() {
        node.data = nodeValue;
    };

    /*
    * 隐藏文件节点
    */
    this.hide = function() {
        node.data = '';
    };
};

/*初始化日志*/
if(window.Lio && Pmoo.isIE){
	//初始化之后隐藏
	Lio.hide();
	
	/*
    Pmoo.monitor = Lio.getLogger({
    	'Title'  : 'Ajax Monitor',
    	'Width'  : 900,
    	'Height' : 80
    });
    */
    
	Pmoo.logger = Lio.getLogger({
        'Height'  : 150,
        'Console' : true
    });
        
    Lio.addErrorLogger(Pmoo.logger);
}

/*日志函数预定义*/
Pmoo.log = function() {
    if(!Pmoo.logger){
    	return false;
    	}
    Pmoo.logger.info.apply(Pmoo.logger, arguments);
};

/*日志函数预定义*/
Pmoo.mon = function() {
    if(!Pmoo.monitor){
    	return false;
    	}
    Pmoo.monitor.info.apply(Pmoo.monitor, arguments);
};

Pmoo.Ajax = {
    get: function(url, opt) {
        var req = new Request({
            url: url,
            onComplete: function() {
                opt.cb(this.xhr, this);
            }
        }).send();
    }
};

/**
 * PageSize
 * -getHeight 获取页面真实高度
 * -getWidth 获取页面真实宽度
 */
Pmoo.PageSize = new function(){
	this.getHeight = function(){
		var bodySize = $(document.body).getSize();
		var scrollSize = $(document.body).getScroll();
		var h = bodySize.y + scrollSize.y;
		return h;
	};

	this.getWidth = function(){
		var bodySize = $(document.body).getSize();
		var scrollSize = $(document.body).getScroll();
		var w = bodySize.x + scrollSize.x;
		return w;
	};	

};
